GitHub ActionsでAWSにAssumeRoleでデプロイしてSlack通知しようとしたらError: Resource not accessible by integrationが発生した
2021/11/26追記 本記事の内容をリポジトリのREADMEに取り込んでもらえました。 https://github.com/8398a7/action-slack/pull/177
吉川@広島です。
GitHub Actions OIDCが熱いですね。日本語情報も続々出てきています。
- GitHub Actions: Secure cloud deployments with OpenID Connect | GitHub Changelog
- GitHub ActionsがOpenID Connectをサポート。GitHubからクラウドへのデプロイがより安全に - Publickey
- GitHub Actions が OpenID Connect をサポートし、デプロイがよりセキュアに出来るようになりました! - サーバーワークスエンジニアブログ
- GitHub Actions で configure-aws-credentials を使った OIDCではまったこと - tech.guitarrapc.cóm
さて、GitHub Actions上で
でAWSへの操作権限を得てデプロイし、その結果を
8398a7/action-slack: Provides the function of slack notification to GitHub Actions.
でSlack通知する仕組みを作ったところ、Slack通知実行時に
Error: Resource not accessible by integration
というエラーが発生し悩まされたので、解決法を共有します。
ちなみに以下、例に出すWorkflowファイルでは説明の簡略化のために use: aws-actions/configure-aws-credentials
の記述を抜き、 uses: 8398a7/action-slack@v3
の処理のみ記述しています。ご留意ください。
原因はpermissionsの指定の仕方にありました。
[OK] permissions指定なし
まず、permissionsを指定せずにSlack通知してみます。
name: Slack test on: push jobs: slack-test: runs-on: ubuntu-latest steps: - uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} fields: repo,message,commit,author,action,eventName,ref,workflow,job,took env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} if: always()
問題なく完了できました。
注目したいのが、GITHUB_TOKEN Permissionsです。明示的にPermissionsを指定しない場合、デフォルトでこれらの権限が付与されるという動きをするようです。
手元で検証した結果、8398a7/action-slack@v3の実行にはcontentsとactionsのread権限が必要のようでした。そして、デフォルトの権限で両方とも満たせているため動作するというわけです。
[NG] id-tokenとcontentsのpermissionsを指定
では上記にconfigure-aws-credentialsを加える想定をします。
Configuring OpenID Connect in Amazon Web Services - GitHub Docs
ドキュメントによると、id-tokenとcontentsのpermissionsを与える必要があると書いてありますね。で、そのようにすると以下のエラーになります。
name: Slack test on: push +permissions: + id-token: write + contents: read jobs: slack-test: runs-on: ubuntu-latest steps: - uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} fields: repo,message,commit,author,action,eventName,ref,workflow,job,took env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} if: always()
Permissionsを明示的に指定した場合、 Metadata: read
を除く指定外の権限はすべてオフになるようです。そのため、actionsの権限が足りずエラーになりました。
[OK] id-tokenとcontentsとactionsのpermissionsを指定
というわけで、明示的に actions: read
を加えます。
name: Slack test on: push permissions: id-token: write contents: read + actions: read jobs: slack-test: runs-on: ubuntu-latest steps: - uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} fields: repo,message,commit,author,action,eventName,ref,workflow,job,took env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} if: always()
これで意図通り動作しました。
まとめ
aws-actions/configure-aws-credentialsと8398a7/action-slack@v3の2つのアクションを組み合わせて使う際には
permissions: id-token: write contents: read actions: read
の権限を明示的にセットする必要があるというお話でした。
今まで雰囲気で扱っていたGitHub ActionsのPermissionsまわりが少しだけわかってきた気がします。